package com.thinvent.remotepassword.util;

import java.io.IOException;

public class SimilarityUtil {

    /**
     * 字符串的二维数组转double
     * @param str
     * @return
     */
    public static double[][] strToDoubleArray(String str) {
        // 去除最外层和最内层数组的括号
        str = str.replace("[", "").replace("]", "").trim();

        // 通过逗号分隔字符串，得到每个数字的字符串表示
        String[] stringNumbers = str.split(",");

        // 初始化double类型的二维数组
        double[][] doubleArray = new double[1][stringNumbers.length];

        // 将每个字符串数字转换为double并放入数组
        for (int i = 0; i < stringNumbers.length; i++) {
            doubleArray[0][i] = Double.parseDouble(stringNumbers[i].trim());
        }
        return doubleArray;
    }

    /**
     * 计算两个double类型二维数组的余弦相似度
     * @param array1 第一个二维数组
     * @param array2 第二个二维数组
     * @return 两个数组的余弦相似度
     */
    public static double cosineSimilarity(double[][] array1, double[][] array2) {
        if (array1 == null || array2 == null || array1.length != array2.length || array1[0].length != array2[0].length) {
            throw new IllegalArgumentException("Arrays must have the same dimensions.");
        }

        double dotProduct = 0.0; // 点积
        double normA = 0.0; // array1的模
        double normB = 0.0; // array2的模

        // 计算点积和各自的模
        for (int i = 0; i < array1.length; i++) {
            for (int j = 0; j < array1[0].length; j++) {
                dotProduct += array1[i][j] * array2[i][j];
                normA += Math.pow(array1[i][j], 2);
                normB += Math.pow(array2[i][j], 2);
            }
        }

        // 防止除以0的情况
        if (normA == 0 || normB == 0) {
            return 0;
        }

        // 计算余弦相似度
        return dotProduct / (Math.sqrt(normA) * Math.sqrt(normB));
    }

    /**
     * 字符串转向量
     * @param vetStr
     * @return
     * @throws IOException
     */
    public static String getVet(String vetStr) throws IOException {
        OkHttpUtil okHttpUtil = new OkHttpUtil();
        String result = okHttpUtil.doGet("http://60.204.204.87:80/text2vet?textstring=" + vetStr);
        return result;
    }

    public static void main(String[] args) throws IOException {
        String prompt = getVet("重大项目库里面，我们有中央预算内投资，有其他地方财政性建设资金。但是填报已完成投资里面，我们的其他地方财政性建设资金是不是填到其他类别汇总里。");
        String question = getVet("调度任务填写和项目申报");

        // 对比相似度
        double v = SimilarityUtil.cosineSimilarity(strToDoubleArray(prompt), strToDoubleArray(question));
        System.out.println("相似度：" + v);
    }

}
